#ifndef PERDOVISITOR_H
#define PERDOVISITOR_H

#include "Visitor.h"
#include "SymbolTable.h"
#include <stack>
#include <string>
#include <ostream>

class PerdoVisitor : public Visitor
{
	public:
		PerdoVisitor(SymbolTable * Sym, std::ostream * Out);

		void visitChar( Char* );
		void visitCommand( Command* );
		void visitId( Id* );
		void visitIndex( Index* );
		void visitNumber( Number* );
		void visitStatementList( StatementList* );
		void visitString( String* );

		void visitAdd( Add* );
		void visitSub( Sub* );
		void visitMul( Mul* );
		void visitDiv( Div* );
		void visitMod( Mod* );
		void visitNeg( Neg* );
		void visitEqu( Equ* );

		void visitDoubleEqual( DoubleEqual* );
		void visitNotEqual( NotEqual* );
		void visitLess( Less* );
		void visitLessEqual( LessEqual* );
		void visitGreater( Greater* );
		void visitGreaterEqual( GreaterEqual* );
		void visitAnd( And* );
		void visitOr( Or* );

		void visitWhile( While* );
		void visitIf( If* );

		void visitFunctionCall( FunctionCall * ) {}
		void visitFunctionDefinition( FunctionDefinition * ) {}
		void visitReturn( Return * ) {}
		void visitParamNode( ParamNode * ) {}
		void visitArgNode( ArgNode * ) {}

	private:
		/////////////////////////////////////////////////////////////////////////
		int RipAS(std::string s);

		void ArraySetSize(int array_id, int size_id);
		void ArrayGetSize(int array_id, int size_id);
		void ArraySetIndex(int array_id, int index_id, int value_id);
		void ArrayGetIndex(int array_id, int index_id, int value_id);
		void ArrayCopy(int src, int dest);
		////////////////////////////////////////////////////////////
		void incWhile();
		void incIf();
		// Increment before using
		std::string getWhile();
		std::string getDoneWhile();
		std::string getIf();
		std::string getElse();
		std::string getDoneIf();
		/////////////////////////////////////////////////////////////////////////
		std::stack<int> stk;
		SymbolTable * sym;
		std::ostream * out;

		int whileCount;
		int ifCount;

		bool parent_is_equ;
		/////////////////////////////////////////////////////////////////////////
};

#endif

